源码里头提到的两个bug。
safari里头的template标签克隆(cloneNode(true))的时候,克隆出来的<template>,其.content内容是空的。 bug#137755
IE10/11 中,如果<textarea> 设置了placeholder 属性,cloneNode(true) 后,克隆出来的 textarea 其.value 会被 错误地写成 placeholder 的字符串 ,而不是原始的 value。
stringToFragment这个函数源码
解析
请注意 L#98 使用 node.lastChild, L#103使用 node.firstChild。
其中node.lastChild是因为 L#10的map.col这个元素 里头<colgroup>之前会插入一个空的<tbody></tbody>,然后我们其实是需要取到 <colgroup>这个node,所以使用了node.lastChild。
至于为什么 prefix 里要先放一个空的<tbody></tbody> ?
这是一个浏览器兼容技巧:如果<table> 后面直接跟<colgroup> ,某些旧浏览器的 HTML 解析器会 自动插入一个隐式<tbody> ,把<colgroup> 吞到 tbody 里面。所以主动先写一个空 tbody 占坑,就能保证 colgroup 一定是 table 的 第二个子节点(lastChild) 。